#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <string.h>
#include <stdlib.h>
#define MAX 128
#define SIZE 32

char cmd_line[MAX];//保存获取输入
char* cmd_parse[SIZE];//命令选项

int main()
{
    //不断执行
    while(1)
    {
        memset(cmd_line,0,sizeof(cmd_line));//清空数据
        printf("[zgj@myhost my_mini_shell]$ ");//显示词条
        fflush(stdout);//强制刷新

        if(fgets(cmd_line,sizeof(cmd_line)-1,stdin))//获取数据
        {
            //获取成功，设置结束符
            cmd_line[strlen(cmd_line)-1]='\0';//注意这里的下标需要减一，因为最后一个接收到的是回车符\n
            //切分命令选项
            int index=0;
            cmd_parse[index]=strtok(cmd_line," ");
            while(cmd_parse[index]!=NULL)
            {
                index++;
                cmd_parse[index]=strtok(NULL," ");
            }
            //分析指令
            if(strcmp(cmd_parse[0],"cd")==0)
            {
                if(chdir(cmd_parse[1])==0)
                    continue;
            }
            else//非内置命令，子进程执行
            {
                pid_t id=fork();
                if(id==0)
                {
                    //child
                    execvp(cmd_parse[0],cmd_parse);
                    exit(1);
                }
                //father
                int status=0;
                pid_t ret=waitpid(-1,&status,0);
                if(ret>0&&WIFEXITED(status))
                {
                    printf("exit code:%d\n",WEXITSTATUS(status));
                }
            }
        }
    }
    return 0;
}
